﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SQLVis.Entidades;

namespace WindowsFormsApplication1
{
    public partial class Generator : Form
    {

        private System.IO.StreamWriter file;

        private Func<DataSetEjemploNW, Dictionary<string, int>, InfoDeLaQuery> generar_select;
        private Func<DataSetEjemploNW, Dictionary<string, int>, InfoDeLaQuery> generar_update;
        private Func<DataSetEjemploNW, Dictionary<string, int>, InfoDeLaQuery> generar_delete;
        private Func<DataSetEjemploNW, Dictionary<string, int>, InfoDeLaQuery> generar_insert;

        private DataSetEjemploNW ds;

        string[] usuarios = { "db[db] @ localhost [127.0.0.1]", 
                                  "wsuser[wsuser] @ localhost.localdomain [127.0.0.1]", 
                                  "gimp[drool] @ algernon.retards.org [10.10.10.7]" };

        private Dictionary<string, int> diccionario_Tabla_Cantidad_de_Registros;
        private InfoDeLaQuery infoDeLaQuery;

        //-----------------------------------------------------------------------------
        public Generator()
        {
            InitializeComponent();
            PopulateCombos();
            StartGeneration();
        }

        //-----------------------------------------------------------------------------
        private void PopulateCombos()
        {
            this.dllQueryType.DataSource = Enum.GetValues(typeof(QueryTypes));
        }

        private void StartGeneration()
        {
            ds= new DataSetEjemploNW();
            //crea el archivo en la carpeta de la solucion
            file = new System.IO.StreamWriter("../../../logslowquerysgenerado.log");

            EscribirHeader(file);
            //new System.IO.StreamWriter("c:\\logslowquerysgenerado.log");

            //IMPORTANTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //COMO NO ME CONECTO A NINGUNA BD LO QUE HAGO ES CHAMUYAR LA CANTIDAD DE REGISTROS QUE TIENE CADA TABLA
            //Y LO GUARDO EN ESTE DICCIONARIO 
            diccionario_Tabla_Cantidad_de_Registros = ConstruirDiccionarioDeTablaCantidadDeRegistros(ds);

            infoDeLaQuery = new InfoDeLaQuery();
            //TUpdateSqlStatement statement2 = new TUpdateSqlStatement(TDbVendor.DbVMssql);
            //TDeleteSqlStatement statement3 = new TDeleteSqlStatement(TDbVendor.DbVMssql);
            //TInsertSqlStatement statement4 = new TInsertSqlStatement(TDbVendor.DbVMssql);

            


            generar_select = (x, y) => GeneradorDeSelect.GenerarSelect(x, y);
            generar_update = (x, y) => GeneradorDeUpdate.GenerarUpdate(x, y);
            generar_delete = (x, y) => GeneradorDeDelete.GenerarDelete(x, y);
            generar_insert = (x, y) => GeneradorDeInsert.GenerarInsert(x, y);
             
            //LOS INSERT ESTAN HECHOS PERO DE A 1 Y ASI NO TIENE SENTIDO QUE UNA QUERY DE INSERTAR 1 SOLO REGISTRO TARDE MUCHO
            //RESTA INVESTIGAR NOTACION DE QUERY DE INSERT DE VARIOS REGISTROS, VER COMO GENERARLAS Y PARSEARLAS

            //EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
            //                                infoDeLaQuery, usuarios, 10, generar_insert);
        }


        //-----------------------------------------------------------------------------
        private void EscribirHeader(System.IO.StreamWriter file)
        {
            file.WriteLine("Log Autogenerado");
            file.WriteLine("Tesis InfoVis");
            file.WriteLine("Time                 Id Command    Argument");
        }


        //-----------------------------------------------------------------------------
        private void EscribirQueryLogCantidadDeVeces(DataSetEjemploNW ds, System.IO.StreamWriter file,
                                             Dictionary<string, int> diccionario_Tabla_Cantidad_de_Registros,
                                             InfoDeLaQuery infoDeLaQuery, string[] usuarios, int cantidad,
                                             Func<DataSetEjemploNW, Dictionary<string, int>, InfoDeLaQuery> generar_query)
        {
            for (int i = 0; i < cantidad; i++)
            {
                file.WriteLine("");
                infoDeLaQuery = generar_query(ds, diccionario_Tabla_Cantidad_de_Registros);
                infoDeLaQuery.UserHost = usuarios[Utiles.random.Next(usuarios.Length - 1)];
                infoDeLaQuery.Time = DateTime.Now;

                /////////////////////////////////////////////////////////////////////////////////////////////////
                //importante ver como calcular esto con un aproximado piola
                //esto es importante: lo voy a tener que hacer depender de rowexamineted y tambien de algun campo en 
                //alguna tabla en particular no se como para que el analisis saque alguna conclusion
                /////////////////////////////////////////////////////////////////////////////////////////////////
                infoDeLaQuery.QueryTime = Utiles.random.Next(1, 15);
                /////////////////////////////////////////////////////////////////////////////////////////////////

                ImprimirInfoQuery(infoDeLaQuery.toStringSeparadoEnLineas(), file);
            }
        }


        //-----------------------------------------------------------------------------
        private Dictionary<string, int> ConstruirDiccionarioDeTablaCantidadDeRegistros(DataSetEjemploNW ds)
        {
            Dictionary<string, int> resultado = new Dictionary<string, int>();

            foreach (DataTable dt in ds.Tables)
            {
                resultado.Add(dt.TableName, Utiles.random.Next(Constantes.CantidadMinimaDeRegistrosEnUnaTabla,
                                                                               Constantes.CantidadMaximaDeRegistrosEnUnaTabla));
            }

            return resultado;
        }


        //-----------------------------------------------------------------------------
        private void ImprimirInfoQuery(string[] infoquery, System.IO.StreamWriter file)
        {
            for (int i = 0; i < infoquery.Length; i++)
            {
                file.WriteLine(infoquery[i]);
            }

        }


        //-----------------------------------------------------------------------------
        private void btnAdd_Click(object sender, EventArgs e)
        {

            int cantidad = int.Parse(this.txtQuantity.Text);
            switch((QueryTypes)this.dllQueryType.SelectedValue)
            {
                case QueryTypes.Select:
                    EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            infoDeLaQuery, usuarios, cantidad, generar_select);
                    break;

                case QueryTypes.Update:
                    EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            infoDeLaQuery, usuarios, cantidad, generar_update);
                    break;

                case QueryTypes.Delete:
                    EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            infoDeLaQuery, usuarios, cantidad, generar_delete);
                    break;

                default:
                    break;
            }

            
            
            
        }

        //-----------------------------------------------------------------------------
        private void btnFinish_Click(object sender, EventArgs e)
        {
            file.Close();
            
            this.Close();

        }

        private void Generator_FormClosing(object sender, FormClosingEventArgs e)
        {
            file.Close();
        }

        
    }
}
